import DictMeta from './DictMeta.ts'
import App from '@/App.vue'
import { createApp } from 'vue'
const app = createApp(App)

const DEFAULT_DICT_OPTIONS = {
  types: [],
}

export default class Dict {
  public owner: null /*所有者*/
  public label: {} /*标签*/
  public type: any /*类型*/
  public _dictMetas: any[]
  /*构造函数*/

  constructor() {
    this.owner = null
    this.label = {}
    this.type = {}
  }

  /* init函数是一个类方法 , 用于初始化类的实例*/
  init(options: any): void {
    /*1. 如果options是个数组， 将其变成对象的形式*/
    if (options instanceof Array) {
      options = {
        types: options,
      }
    } else {
      /*否则就是一个只有type属性的空对象*/
      options = DEFAULT_DICT_OPTIONS
    }

    const opts = options /*opts是对象*/
    /*2. 如果opts.types 还是为空则抛出异常*/
    if (opts.types === undefined) {
      throw new Error('need dict types')
    }

    /*2. 再对对象进行解析*/
    this._dictMetas = opts.types.map((t: any) => {
      /*对字符进行封装，将其变成DictMeta*/
      let parse = DictMeta.parse(t)
      return parse
    })

    const ps = []
    /*3. 对每一项进行遍历*/
    this._dictMetas.forEach((dicMeta: DictMeta) => {
      const type = dicMeta.type
      this.type[type] = [] // 直接修改响应式对象的属性值
      ps.push(loadDict(this, dicMeta))
    })

    /*ps中所有的东西都要执行成功*/
    return Promise.all(ps)
  }
}

/*loadDict方法，也就是使用request方法进行请求*/
function loadDict(dict, dicMeta: DictMeta) {
  return dicMeta.request(dicMeta).then((response: any) => {
    const type = dicMeta.type
    /*对结果进行转换操作*/
    let dicts = dicMeta.responseConverter(response, dicMeta)

    /*对dict中的type进行更新*/
    dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts)
  })
}
